package utils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/*
    JDBC工具类: 用来获取连接对象,释放资源

    练习:
        用配置文件: scr/config.properties
 */
/*public class JDBCUtil {
    //定义数据库的连接地址
    private static String url;
    //定义用户名
    private static String userName;
    //定义密码
    private static String passWord;
    //定义驱动全类名地址闸包文件驱动
    private static String driverClassName;
    //构造私有
    private JDBCUtil(){}

    //注册驱动,只需要一次,放到静态代码块中
    static {

        //1.注册驱动
        try {
            //读取配置文件,给连接地址的四个变量赋值
            //创建配置文件对象
            //读取相关配置文件
            //Properties类表示一组持久的属性列表，有键和值，类似map。
            Properties props = new Properties();

            // InputStream in = new FileInputStream("day19\\src\\config.properties");
            //可以使用类加载器,帮助我们加载资源
            //要求,必须放在src根目录下
            //本质上是配置文件要放在存储class文件的classes目录的根路径下
            //FileInputStream文件字节输入流按字节的形式来读取文件
            //InputStream输入是所有实现类输入流的抽象父类
            //查找具有给定名称的资源。


            //.class获取JDBCUtil字节码class的对象
            //必须放在src的根目录下，本质是放在classes目录的根路径下
            //getClassLoader获取类的加载器：：类加载器是负责加载类的对象。将class文件（硬盘）加载到内存生成Class对象。
            //getResourceAsStream：查找具有给定名称的资源。再通过类加载器将输入流对象放到内存中，然后通过class获的对象获取该内容
            InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("config.properties");
            props.load(in);

            //获取属性值
            url = props.getProperty("url");
            userName = props.getProperty("userName");
            passWord = props.getProperty("passWord");
            driverClassName = props.getProperty("driverClassName");
            //注册驱动
            Class.forName(driverClassName);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //定义静态方法,获取Connection连接对象
    public static Connection getConnection() throws Exception {
        //2. 获得连接.
        //调用方法,获取到数据库的连接对象
        Connection con = DriverManager.getConnection(url, userName, passWord);
        return con;
    }

    //释放资源
    public static void release(Connection con, Statement stmt, ResultSet rs) {
        //4.关闭资源
        if(con!=null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}*/


public class JDBCUtil {
    private  static  String  url;
    private  static  String  userName;
    private  static  String  passWord;
    private  static  String  driverClassName;

    public JDBCUtil() { }

    static {
        try {
          //Properties类表示一组持久的属性列表，有键和值，类似map,获取配置文件信息。
            //getClassLoader()：取得该Class对象的类装载器
            //getResourceAsStream输入文件名为读取文件，返回的是inputStream类型的。
          Properties properties=new Properties();
          InputStream inputStream=JDBCUtil.class.getClassLoader().getResourceAsStream("config.properties");
          properties.load(inputStream);
          url=properties.getProperty("url");
          userName=properties.getProperty("userName");
          passWord=properties.getProperty("passWord");
          driverClassName=properties.getProperty("driverClassName");


          //注册驱动,写在静态代码里只执行一遍
          Class.forName(driverClassName);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public  static Connection getConnection() throws SQLException {
       //DriverManager为工具类，用于管理一组JDBC驱动程序的基本服务。
        // getConnection方法，尝试建立与给定数据库URL的连接。
       Connection connection=DriverManager.getConnection(url,userName,passWord) ;
       return  connection;
    }
    public static void  release(Connection connection,Statement statement,ResultSet resultSet){
       if(connection !=null){
           try {
               connection.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
        if(statement !=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(resultSet !=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}